/**
 * Created by toreal on 2017/5/27.
 */
/**
 * 黄浩华封装的微信分享接口，不依赖于jq也可以用了
 * */
(function () {
    //在这里定义分享的内容
    var initUrl = '',
        hasInit = false,//是否注册成功微信js了
        fns = [],//用于存储未注册微信 js 前调用的函数
        doingActions = {},//有的接口正在调用时不允许再次调用的,如果正在调用,会到这存一个值
        jsApiList = ['onSearchBeacons','startSearchBeacons','scanQRCode','chooseWXPay','chooseImage','uploadImage',"onMenuShareTimeline",
            "onMenuShareAppMessage",'onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone','hideMenuItems'],
        weChat_js,
        hasStartSearchBeacons;

    weChat_js = {

        /**
         * 外面调用这个就可以设置分享,调用这个之后也要等到微信api注册成功之后才生效的。
         * */
        wxShare:function(data){
            var self = this;
            if(!hasInit){
                fns.push(function(){
                    self.wxShare(data);
                });
                return;
            }

            data = data || {
                    title: document.title, // 分享标题
                    desc: document.title, // 分享描述
                    link: location.href, // 分享链接
                    imgUrl: function(){
                        var imgs = $('img');
                        if(imgs[0]){
                            var src = imgs[0].src;
                            return src.indexOf('http')===0?src:location.origin+location.pathname+src;
                        }else{
                            return location.origin+location.pathname+'images/nazou_logo.png';
                        }
                    }()
                };

            //分享朋友
            wx.onMenuShareAppMessage(data);
            //分享朋友圈
            wx.onMenuShareTimeline(data);
            //分享到QQ
            wx.onMenuShareQQ(data);
            //分享到腾讯微博
            wx.onMenuShareWeibo(data);
            //分享到QQ空间
            wx.onMenuShareQZone(data);
        },

        /**
         * 打开微信支付窗口
         * @param data obj
         * @param data.pack string 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=***）
         * @param data.nonceStr string 支付签名随机串，不长于 32 位
         * @param data.paySign string 采用统一的微信支付 Sign 签名生成方法，注意这里 appId 也要参与签名，
         *                          appId 与 config 中传入的 appId 一致，
         *                          即最后参与签名的参数有 appId, timeStamp, nonceStr, package, signType
         * @param data.signType string 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
         * @param data.timestamp int 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。
         *                          但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
         * @param success string 支付成功后的回调函数,第一个参数是数字:1成功支付,2用户取消了,0遇到bug。第二个参数是微信传回的原始参数
         * */
        chooseWXPay:function (data,success){
            var self = this;
            if(!hasInit){
                fns.push(function(){
                    self.chooseWXPay(data,success);
                });
                return;
            }

            if(success){
                data.success = function(res){
                    if(res.errMsg == "chooseWXPay:ok"){
                        success(1,res);
                    }else if(res.errMsg=='chooseWXPay:cancel'){
                        //用户取消了
                        success(2,res);
                    }else {
                        success(0,res);
                    }
                };
                data.fail = function (res) {
                    success(0,res);
                }
            }
            wx.chooseWXPay(data);
        },

        /**
         * 打开微信扫描
         * @param fn 有回调函数，就会返回扫码结果，而不让微信自动处理
         * @param type array 填入想要用的所有类型，1二维码，2条形码。不填，或者一个都没填对，默认用全部
         * */
        scanQRCode:function (fn,type) {
            var self = this;
            if(!hasInit){
                fns.push(function(){
                    self.scanQRCode(fn,type);
                });
                return;
            }

            var typeOption = ["qrCode","barCode"],
                types = [];
            if(!type instanceof Array||!type.length){
                types = typeOption;
            }else{
                for(var i=0;i<type.length;i++){
                    if(typeOption[type[i]]){
                        types.push(typeOption[type[i]])
                    }
                }
                if(!types.length){
                    types = typeOption;
                }
            }

            wx.scanQRCode({
                needResult: fn?1:0, // 默认为0，扫描结果由微信处理，1则直接返回扫描结果，
                scanType: types, // 可以指定扫二维码还是一维码，默认二者都有
                success: function (res) {
                    var result = res.resultStr; // 当needResult 为 1 时，扫码返回的结果
                    fn&&fn(result);
                }
            });
        },

        /**
         * 扫描周边已经添加到该公众号的 ibeacon 设备。
         * ps. 这些设备添加到公众号后，还要加到任意分组后，才能扫描得出来
         * ps2. 设备无需激活
         * ps3. 如果周边没有已开启合法的设备，是不会有回调的，这不是bug，如果有设备，就会不停回调
         * @param fn function
         * @param ticket 摇周边的业务ticket，系统自动添加在摇出来的页面链接后面
         * */
        onSearchBeacons:function(fn,ticket){
            var t = this;
            if(!hasInit){
                fns.push(function(){
                    t.onSearchBeacons(fn,ticket);
                });
                return;
            }

            if(hasStartSearchBeacons){
                onSearchBeacons()
            }else{
                wx.startSearchBeacons({
                    complete:function (res) {
                        if(res.errMsg=='startSearchBeacons:ok'||res.errMsg=='startSearchBeacons:already started'){
                            hasStartSearchBeacons = true;
                            onSearchBeacons();
                        }else if(res.errMsg=='startSearchBeacons:bluetooth power off'){
                            alert('请打开蓝牙')
                        }else if(res.errMsg=='startSearchBeacons:location service disable'){
                            alert('请打开定位')
                        }else if(res.errMsg=='startSearchBeacons:system unsupported'){
                            alert('您的系统暂时不支持此功能')
                        }else{
                            alert(res.errMsg||'发生未知错误');
                        }
                    }
                });
            }

            function onSearchBeacons(){
                wx.onSearchBeacons({
                    complete:function(res){
                        //回调函数
                        if(res.beacons){
                            var beacons = [{
                                uuid:'FDA50693-A4E2-4FB1-AFCF-C6EB07647825',
                                major:'10109',
                                minor:'28814',
                                accuracy:'0.15611358027757272',//距离，单位为米
                                rssi:'-49.0',//接收信号的强度指示
                                heading:'323.81384',//接收信号时设备的方向（安卓设备返回有此字段，iOS无）；iOS设备若需要获取方向，可以利用HTML5标准API获取
                                proximity:'1' //精度，0：CLProximityUnknown（不见了）, 1：CLProximityImmediate（超近）, 2：CLProximityNear（近）, 3：CLProximityFar（远）
                            }];
                            fn&&fn(res.beacons)
                        }else{
                            alert(res.errMsg||'出现未知错误')
                        }
                        //
                    }
                });
            }

        },
        //隐藏部分功能
        hideMenu:function(hideList){
            var t = this;
            if(!hasInit){
                fns.push(function(){
                    t.hideMenu(hideList);
                });
                return;
            }
            hideList=hideList || [
                    'menuItem:share:QZone',         //分享空间
                    'menuItem:share:appMessage',    //分享朋友
                    'menuItem:share:qq',            //分享qq
                    'menuItem:copyUrl',             //复制链接
                    'menuItem:openWithSafari',      //safari打开
                    'menuItem:openWithQQBrowser',   //qq浏览器打开
                    'menuItem:share:timeline',      //分享朋友圈
                    'menuItem:favorite',            //收藏
                    'menuItem:share:weiboApp',      //微博
                    'menuItem:share:facebook',      //facebook
                    'menuItem:share:email',         //邮件
                ];

            wx.hideMenuItems({
                menuList: hideList
            });
        },

        //注册微信js
        init:function(){
            if(hasInit)
                return;

            var test = location.href.indexOf('test')>=8;
            var url = encodeURIComponent(location.href.split('#')[0]);
            ajax(
                "https://heyi.api.189go.cn/index.php/get/getJsApiTicket?url="+url,
                function(data){
                    data = JSON.parse(data);
                    if(data.status==1){
                        data = data.data;
                        var config = {
                            debug: test,
                            appId: data.appid,
                            timestamp: data.timestamp,
                            nonceStr: data.noncestr,
                            signature: data.signature,
                            jsApiList: jsApiList
                        };
                        wx.ready(function(){
                            hasInit = true;
                            runFnsInQueue();
                        });
                        wx.error(function(res){
                            console.log("wx.config:error",res);
                            if(test){
                                alert(res.errMsg+'\n'+JSON.stringify(config))
                            }
                        });
                        wx.config(config);
                    }
                }
            );
        }
    };

    //执行在队列中的函数,因为有可能外部在js接口未注册成功时调用微信接口。
    function runFnsInQueue() {
        if(hasInit&&fns.length){
            for(var i=0,fNum=fns.length;i<fNum;i++){
                if(!fns.length)
                    break;

                var fn = fns.shift();
                if(fn&&typeof fn=='function'){
                    fn();
                }
            }
        }
    }


    /**
     * 原生ajax请求
     * @param url String 响应请求的链接
     * @param options object/Function
     * @param options.args Object 传给服务器的参数，也可以使用String，但是内容要用键值对的方式写好，参数之间用&
     * @param options.method String 值："POST"或"GET"。默认：如果有args值就是POST，没有就GET
     * @param options.complete Function 成功或者失败都回调的函数
     * @param options.cache Boolean 是否缓存
     * @param options.dataFormat String 值："JSON": 返回 JSON 数据,"String": 返回 String 数据(ps.现在返回的数据都是原始数据，不会给你转的！)
     *
     * ps.输出的数据可能需要手动转换成json：var data = JSON.parse(data);
     */
    function ajax(url,options){
        var req = new XMLHttpRequest(),
            complete = options.complete||options,
            method = options.method||"POST",
            dataFormat = options.dataFormat||'JSON',
            cache = options.cache||true,
            args = options.args||'';

        url = url+(cache?'':((url.indexOf('?')>=0?'&':'?')+"random="+Math.random()));

        if(complete){
            req.onreadystatechange = function(){
                if (req.readyState==4 && req.status==200){
                    //晚一些用try...catch来判断数据格式
                    //var reData = req.responseText;
                    //if(dataFormat=='JSON')reData = JSON.parse(reData);//JSON.stringify()
                    complete(req.responseText);
                    //complete.apply(null,[req.responseText]);
                }
                //else console.log('[Hquery]请求未完成或者出错:',req);
            }
        }
        req.open(method,url,true);
        var argString;
        if(args){
            req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            argString = '';
            if(typeof args=='string'){
                argString = args;
            }else{
                for(var key in args){
                    if(!(args[key]===undefined||args[key]===null))
                        argString += key + '=' + encodeURIComponent(args[key]) + '&';
                }
            }
            argString = argString.replace(/(^&+)|(&+$)/g,'');//去掉前后的&符号
        }
        req.send(argString);
    }

    weChat_js.init();

    window.wxShare = weChat_js.wxShare;
    window.weChat_js = weChat_js;

}());